//
//  WmcEditWatermarkDelegate.swift
//  YPWatermarkCamera
//
//  Created by 赵新 on 2022/7/22.
//

import UIKit
import YPBedrock

// MARK: - [WmcEditWatermarkDelegate]

public protocol WmcEditWatermarkDelegate: NSObjectProtocol {
    // MARK: 导航栏

    /// 顶部导航栏右侧按钮列表
    /// - Parameters:
    ///   - attribute: 属性
    ///   - watermarkModel: 当前的水印
    ///   - defaultList: 默认列表
    /// - Returns: 设置后的按钮列表
    func navigationRightMenuList(_ attribute: WmcAttribute,
                                 watermarkModel: WmcWatermarkDetailModel,
                                 defaultList: [WmcButtonItemType.EditWMNavigation])
        -> [WmcButtonItemType.EditWMNavigation]

    // MARK: 水印的编辑属性设置

    /// 设置水印的字段属性列表
    /// 主要控制水印的：标题、时间、地点、天气、经纬度、海拔、方位角、分贝、速度以及自定义字段
    /// 可以选择一些字段不显示
    /// - Parameters:
    ///   - attribute: 属性
    ///   - watermarkModel: 当前的水印
    ///   - defaultList: 默认列表
    /// - Returns: 设置后的字段属性列表
    func editAttributeList(_ attribute: WmcAttribute,
                           watermarkModel: WmcWatermarkDetailModel,
                           defaultList: [WmcWatermarkOptionModel.FieldType])
        -> [WmcWatermarkOptionModel.FieldType]

    /// 设置底部基础属性列表
    /// 主要控制水印透明度、大小
    /// 可以选择一些字段不显示
    /// - Parameters:
    ///   - attribute: 当前水印相机的属性
    ///   - watermarkModel: 当前的水印
    ///   - defaultList: 默认属性列表
    /// - Returns: 设置后的基础属性列表
    func editBasicList(_ attribute: WmcAttribute,
                       watermarkModel: WmcWatermarkDetailModel,
                       defaultList: [WmcButtonItemType.EditWMBasicItem])
        -> [WmcButtonItemType.EditWMBasicItem]

    // MARK: 自定义列表

    /// 水印编辑页进行注册Cell
    /// - Parameters:
    ///   - attribute: 当前水印相机的属性
    /// - Returns: 注册Cell的对象集合
    func tableViewRegisterCell(_ attribute: WmcAttribute)
        -> [YPRegister]

    /// 设置水印字段属性Cell的高度
    /// - Parameters:
    ///   - attribute: 当前水印相机的属性
    ///   - tableView: UITableView
    ///   - indexPath: IndexPath
    ///   - watermarkModel: 当前的水印
    ///   - fieldType: 水印字段的属性类型
    ///   - defaultHeight: 默认的高度
    /// - Returns: Cell的高度
    func tableViewHeightForAttributeRow(_ attribute: WmcAttribute,
                                        tableView: UITableView,
                                        indexPath: IndexPath,
                                        watermarkModel: WmcWatermarkDetailModel,
                                        fieldType: WmcWatermarkOptionModel.FieldType,
                                        defaultHeight: CGFloat)
        -> CGFloat

    /// 设置水印基础属性Cell的高度
    /// - Parameters:
    ///   - attribute: 当前水印相机的属性
    ///   - tableView: UITableView
    ///   - indexPath: IndexPath
    ///   - watermarkModel: 当前的水印
    ///   - basicItem: 基础属性类型，透明度、大小等
    ///   - defaultHeight: 默认的高度
    /// - Returns: Cell的高度
    func tableViewHeightForBasicRow(_ attribute: WmcAttribute,
                                    tableView: UITableView,
                                    indexPath: IndexPath,
                                    watermarkModel: WmcWatermarkDetailModel,
                                    basicItem: WmcButtonItemType.EditWMBasicItem,
                                    defaultHeight: CGFloat)
        -> CGFloat

    /// 使用自定义Cell，替换列表的某个Cell
    /// - Parameters:
    ///   - attribute: 当前水印相机的属性
    ///   - tableView: UITableView
    ///   - indexPath: IndexPath
    ///   - watermarkModel: 当前的水印
    ///   - option: 水印字段的属性配置
    /// - Returns: Cell，返回空则使用水印相机的Cell
    func tableViewReplaceCellForRow(_ attribute: WmcAttribute,
                                    tableView: UITableView,
                                    indexPath: IndexPath,
                                    watermarkModel: WmcWatermarkDetailModel,
                                    option: WmcWatermarkOptionModel)
        -> UITableViewCell?
    
    // MARK: 事务类
    /// Cell点击
    /// - Parameters:
    ///   - attribute: 当前水印相机的属性
    ///   - tableView: tableView
    ///   - indexPath: 索引
    ///   - watermarkModel: 当前的水印
    ///   - option: 点击的属性对象
    /// - Returns: WmcActionType 自定义事件
    func tableViewDidSelectRow(_ attribute: WmcAttribute,
                               tableView: UITableView,
                               indexPath: IndexPath,
                               watermarkModel: WmcWatermarkDetailModel,
                               option: WmcWatermarkOptionModel)
        -> WmcActionType
    
    /// 水印模型重新加载时
    /// - Parameters:
    ///   - attribute: 当前水印相机的属性
    ///   - watermarkModel: 当前的水印
    func watermarkModelReload(attribute: WmcAttribute,
                              watermarkModel: WmcWatermarkDetailModel)
}

// MARK: - 驱动方法

public extension WmcEditWatermarkDelegate {
    /// 刷新设置列表的tableView
    func wmc_reloadTableData() {
        YPWmcDrivingManager.shared.watermarkEdit_reloadTableDataBlock?()
    }

    /// 修改水印的某个字段属性配置
    /// - Parameters:
    ///   - index: 索引
    ///   - option: 属性配置
    func wmc_changeWatermarkOption(at index: Int, option: WmcWatermarkOptionModel) {
        YPWmcDrivingManager.shared.watermarkEdit_changeWatermarkOptionBlock?(index, option)
    }

    /// 替换水印模型
    /// - Parameter watermarkModel: 水印模型
    func wmc_replaceWatermark(_ watermarkModel: WmcWatermarkDetailModel) {
        YPWmcDrivingManager.shared.watermarkEdit_reloadWatermarkModelBlock?(watermarkModel)
    }
}

// MARK: - =========================⚠️以下对接业务方无需查看或了解⚠️=========================

// MARK: 可选方法

public extension WmcEditWatermarkDelegate {
    /// 顶部导航栏右侧按钮列表
    func navigationRightMenuList(_ attribute: WmcAttribute,
                                 watermarkModel: WmcWatermarkDetailModel,
                                 defaultList: [WmcButtonItemType.EditWMNavigation]) -> [WmcButtonItemType.EditWMNavigation]
    {
        return defaultList
    }

    /// 设置水印的字段属性列表
    func editAttributeList(_ attribute: WmcAttribute,
                           watermarkModel: WmcWatermarkDetailModel,
                           defaultList: [WmcWatermarkOptionModel.FieldType]) -> [WmcWatermarkOptionModel.FieldType]
    {
        return defaultList
    }

    /// 设置底部基础属性列表
    func editBasicList(_ attribute: WmcAttribute,
                       watermarkModel: WmcWatermarkDetailModel,
                       defaultList: [WmcButtonItemType.EditWMBasicItem]) -> [WmcButtonItemType.EditWMBasicItem]
    {
        return defaultList
    }

    // MARK: 自定义列表

    /// 水印编辑页进行注册Cell
    func tableViewRegisterCell(_ attribute: WmcAttribute) -> [YPRegister] {
        return []
    }

    /// 设置水印属性Cell的高度
    func tableViewHeightForAttributeRow(_ attribute: WmcAttribute,
                                        tableView: UITableView,
                                        indexPath: IndexPath,
                                        watermarkModel: WmcWatermarkDetailModel,
                                        fieldType: WmcWatermarkOptionModel.FieldType,
                                        defaultHeight: CGFloat) -> CGFloat
    {
        return defaultHeight
    }

    /// 设置基础Cell的高度
    func tableViewHeightForBasicRow(_ attribute: WmcAttribute,
                                    tableView: UITableView,
                                    indexPath: IndexPath,
                                    watermarkModel: WmcWatermarkDetailModel,
                                    basicItem: WmcButtonItemType.EditWMBasicItem,
                                    defaultHeight: CGFloat) -> CGFloat
    {
        return defaultHeight
    }

    /// 使用自定义Cell，替换列表的某个Cell
    func tableViewReplaceCellForRow(_ attribute: WmcAttribute,
                                    tableView: UITableView,
                                    indexPath: IndexPath,
                                    watermarkModel: WmcWatermarkDetailModel,
                                    option: WmcWatermarkOptionModel) -> UITableViewCell?
    {
        return nil
    }

    /// Cell点击
    func tableViewDidSelectRow(_ attribute: WmcAttribute,
                               tableView: UITableView,
                               indexPath: IndexPath,
                               watermarkModel: WmcWatermarkDetailModel,
                               option: WmcWatermarkOptionModel) -> WmcActionType
    {
        return .default
    }
    
    /// 水印模型重新加载时
    func watermarkModelReload(attribute: WmcAttribute,
                              watermarkModel: WmcWatermarkDetailModel) {}
}
